{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1.生成多维空列表\n",
    "#### 2.fig, ax = plt.subplots(figsize = (a, b))画图的入门操作\n",
    "#### 6.zip()将可迭代的对象作为参数，将对象中对应的元素打包成一个个元组\n",
    "#### 7.enmuerate()将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列\n",
    "#### 8.tqdm可扩展的进度条，添加一个进度提示信息\n",
    "#### [9.json序列化，反序列化，是一个序列化标准文件](#nine)\n",
    "#### 10.pickle序列化，反序列化，是一个二进制文件\n",
    "#### 11.endswitch()判断字符串是否以指定后缀结尾\n",
    "***\n",
    "#### [12.os.listdir()返回指定的文件夹包含的文件或文件夹的名字的列表](#12)\n",
    "#### 13.os.path.join()路径拼接\n",
    "#### 14.os.path.split()分割文件名和路径，返回元组\n",
    "#### 15.str.strip(rm)删除开头和结尾的空字符\n",
    "#### 16.dir(obj)返回数据结构的有效属性\n",
    "****\n",
    "#### [17.列表排序sorted(list, key=lambad x: x[0])](#17)\n",
    "#### 17-1.字典的排序sorted(d.items(), key=lambda x: x[1])中 d.items()为待排序的对象\n",
    "#### <font color=\"green\">17-2.sort和sorted的区别</font>\n",
    "#### 18.反转字典的key和value\n",
    "#### [19.将关系三元组(rel, ent1, ent2)转换为{(ent1, rel, ent2.type):[]}尾实体作为alue，方便问题的提出](#19)\n",
    "\n",
    "#### 3.numpy.meshgrid用向量生成坐标矩阵(具体没发现怎么用)\n",
    "#### 4.collections类中的defaultdict()方法可以为字典提供默认值\n",
    "#### 5.re正则表达式"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 169,
   "metadata": {},
   "outputs": [],
   "source": [
    "import re\n",
    "import os\n",
    "import time \n",
    "import torch\n",
    "import json \n",
    "import pickle\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from collections import defaultdict\n",
    "from tqdm import tqdm"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1.生成多维空列表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[], [], []]\n"
     ]
    }
   ],
   "source": [
    "n_classes = 3\n",
    "all_x = [[] for _ in range(n_classes)]\n",
    "print(all_x)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2.fig, ax = plt.subplots(figsize = (a, b))\n",
    "**_, ax = plt.subplots(1, 1, figsize=(10,10))**\n",
    "* fig表示绘制窗口，ax表示窗口的坐标，一般对ax操作\n",
    "    * fig, ax = plt.subplots(1, 3, 1)\n",
    "        * 第一个1参数是子图的行数，\n",
    "        * 第二个3参数是子图的列数\n",
    "        * 第三个1参数是代表第一个子图，\n",
    "* 如果想要设置子图的宽度和高度可以在函数内加入figsize值。\n",
    "***\n",
    "```python\n",
    "fig, ax = plt.subplots()\n",
    "# 上面一条语句等价于下面两个\n",
    "fig = plt.figure()\n",
    "ax = fig.add_subplot(1, 1, 1)\n",
    "```\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x15145002e88>"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(1, 1)# 画一个图\n",
    "x = np.linspace(0, 2*np.pi, 100)# 表示在区间[0, 2π]之间取100个点作为横坐标\n",
    "y = np.sin(x)\n",
    "# 绘图\n",
    "ax.plot(x, y, label=\"sin\")\n",
    "\n",
    "x = np.linspace(0, 2*np.pi, 100)# 表示在区间[0, 2π]之间取100个点作为横坐标\n",
    "y = np.cos(x)\n",
    "# 绘图\n",
    "ax.plot(x, y, label=\"cos\")\n",
    "plt.legend()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x15143400dc8>"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(2, 1)\n",
    "x = np.linspace(0, 2*np.pi, 100)# 表示在区间[0, 2π]之间取100个点作为横坐标\n",
    "y1 = np.sin(x)\n",
    "y2 = np.cos(x)\n",
    "\n",
    "ax[0].plot(x, y1, label=\"sin\")\n",
    "ax[1].plot(x, y2, label=\"cos\", color=\"red\")\n",
    "\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 6.zip\n",
    "将可迭代的对象作为参数，将对象中对应的元素打包成一个个元组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('FAC', 'facility')\n",
      "('GPE', 'geo political')\n",
      "('LOC', 'location')\n",
      "('ORG', 'organization')\n",
      "('PER', 'person')\n",
      "('VEH', 'vehicle')\n",
      "('WEA', 'weapon')\n"
     ]
    }
   ],
   "source": [
    "ace2005_entities = ['FAC', 'GPE', 'LOC', 'ORG', 'PER', 'VEH', 'WEA']\n",
    "ace2005_entities_full = [\"facility\",\"geo political\",\"location\",\"organization\",\"person\",\"vehicle\",\"weapon\"]\n",
    "\n",
    "for ent in zip(ace2005_entities, ace2005_entities_full):\n",
    "    print(ent)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 7.enmuerate()\n",
    "将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列，同时列出数据和数据下标"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 这\n",
      "1 是\n",
      "2 一个\n",
      "3 测试\n"
     ]
    }
   ],
   "source": [
    "list1 = [\"这\", \"是\", \"一个\", \"测试\"]\n",
    "\n",
    "for index,item in enumerate(list1):\n",
    "    print(index,item)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 8.tqdm()\n",
    "可扩展的Python进度条，可以在 Python 长循环中添加一个进度提示信息"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      "  0%|                                                                                            | 0/3 [00:00<?, ?it/s]"
     ]
    }
   ],
   "source": [
    "lista = [\"i\", \"love\", 'you']\n",
    "data = tqdm(lista)\n",
    "# data.set_description(\"测试中：\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "epoch:0:   0%|                                                                                   | 0/3 [00:00<?, ?it/s]\u001b[A"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 i\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "epoch:0:  33%|█████████████████████████                                                  | 1/3 [00:01<00:02,  1.00s/it]\u001b[A"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 love\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "epoch:0:  67%|██████████████████████████████████████████████████                         | 2/3 [00:02<00:01,  1.00s/it]\u001b[A"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2 you\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "epoch:0: 100%|███████████████████████████████████████████████████████████████████████████| 3/3 [00:03<00:00,  1.00s/it]\u001b[A\n",
      "\n",
      "epoch:1:   0%|                                                                                   | 0/3 [00:00<?, ?it/s]\u001b[A"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 i\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "epoch:1:  33%|█████████████████████████                                                  | 1/3 [00:01<00:02,  1.00s/it]\u001b[A"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 love\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "epoch:1:  67%|██████████████████████████████████████████████████                         | 2/3 [00:02<00:01,  1.00s/it]\u001b[A"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2 you\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "epoch:1: 100%|███████████████████████████████████████████████████████████████████████████| 3/3 [00:03<00:00,  1.00s/it]\u001b[A\n"
     ]
    }
   ],
   "source": [
    "for epoch in range(2):# 设置两个epoch\n",
    "    tqdm_data = tqdm(lista, desc=\"epoch:%d\"%epoch)\n",
    "    for i,data in enumerate(tqdm_data):\n",
    "        print(i, data)\n",
    "        time.sleep(1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <span id=\"nine\">9.json</span>\n",
    "## json.dumps()一个Python数据结构转化为json格式\n",
    "## json.loads()一个json编码的字符串转换会一个Python数据结构\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'dict'>\n",
      "{\"name\": \"myname\", \"age\": 100}\n",
      "<class 'str'>\n",
      "====================万能的分隔符====================\n",
      "{'name': 'myname', 'age': 100}\n",
      "<class 'dict'>\n"
     ]
    }
   ],
   "source": [
    "data = {\n",
    "    'name' : 'myname',\n",
    "    'age' : 100,\n",
    "}\n",
    "print(type(data))\n",
    "json_str = json.dumps(data)\n",
    "print(json_str)\n",
    "print(type(json_str))\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "\n",
    "data = json.loads(json_str)\n",
    "print(data)\n",
    "print(type(data))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## json.dump() 和 json.load() 来编码和解码JSON数据\n",
    "## 用于处理文件"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'list'>\n",
      "dict_keys(['txt_ids', 'tags', 'context_mask', 'token_type_ids', 'turn_mask'])\n"
     ]
    }
   ],
   "source": [
    "with open(\"test.json\", \"r\") as f:\n",
    "    data = json.load(f)\n",
    "# print(data)\n",
    "print(type(data))\n",
    "data_0 = data[0].keys()\n",
    "print(data_0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 10.pickle序列化\n",
    "* 不同于json的点：\n",
    "    * pickle保存的是一个二进制文件，不能打开预览\n",
    "    * json保存的是一个序列化文件，可以打开预览"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* $pickle.dump(obj, file, protocol=None,*,fix\\_imports=True)$\n",
    "    * 将序列化后的对象obj以二进制形式**写入文件file**中，进行保存\n",
    "* $pickle.dumps()$\n",
    "    * pickle.dumps()方法**不需要写入文件**中，它是直接返回一个序列化的bytes对象\n",
    "***\n",
    "* $pickle.load(file, *,fix\\_imports=True, encoding=”ASCII”. errors=”strict”)$\n",
    "    * 该方法实现的是将序列化的对象**从文件file中读取**出来\n",
    "* $pickle.loads(bytes\\_object, *,fix\\_imports=True, encoding=”ASCII”. errors=”strict”)$\n",
    "    * pickle.loads()方法是直接从bytes对象中读取序列化的信息，而非从文件中读取"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 167,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "====================万能的分隔符====================\n",
      "<_io.BufferedReader name='pickle_data'>\n",
      "[{'txt_ids': [101, 2424, 2035, 4322, 11422, 1999, 1996, 6123, 1012, 102, 5925, 2739, 2466, 102, 2066, 2116, 27399, 2163, 1010, 5947, 2038, 2018, 4390, 4363, 2402, 2111, 2091, 2006, 1996, 3888, 2030, 5973, 2306, 2110, 3210, 1012, 2007, 2313, 14071, 2075, 1010, 1996, 2110, 2003, 2559, 3458, 2049, 6645, 2005, 24159, 1012, 2004, 5925, 1005, 1055, 3958, 16596, 4904, 3406, 4311, 1010, 2028, 2210, 2237, 2089, 3073, 1037, 2502, 10800, 1012, 2006, 20772, 2305, 2695, 3077, 5683, 2066, 9627, 1010, 3915, 1010, 2021, 1037, 2298, 2105, 2023, 2237, 1997, 1016, 1010, 2199, 3065, 2009, 1005, 1055, 2468, 1037, 12973, 8547, 2479, 1012, 2023, 2001, 2019, 2035, 1011, 2317, 1010, 2035, 1011, 3017, 2451, 2008, 2035, 1996, 5573, 2001, 2579, 2058, 1011, 1011, 2025, 2579, 2058, 1010, 2008, 1005, 1055, 1037, 2200, 2919, 3601, 1997, 2616, 1010, 2021, 10836, 2011, 1010, 3383, 2367, 2967, 1012, 2009, 2211, 2043, 1037, 2038, 28173, 2278, 3644, 2155, 4149, 2028, 1997, 1996, 2237, 1005, 1055, 2048, 6240, 1011, 14743, 4264, 2410, 2086, 3283, 1012, 2034, 2027, 2716, 1999, 2060, 2038, 28173, 2278, 5181, 1010, 2059, 4916, 2015, 1010, 21524, 1010, 5969, 2015, 1012, 1996, 3269, 1998, 2178, 2279, 3573, 2904, 1996, 2227, 1997, 2695, 3077, 1012, 1045, 2228, 2695, 3077, 2453, 2022, 9105, 2039, 2007, 1996, 2717, 1997, 2637, 1012, 2065, 2017, 2298, 2035, 2058, 2637, 1010, 2065, 2017, 2106, 1037, 2817, 1997, 2151, 2307, 2103, 1010, 2017, 2052, 2156, 1996, 2168, 2518, 1012, 1996, 4264, 3271, 12996, 3171, 2458, 1999, 1037, 2237, 2008, 2018, 2146, 2042, 2358, 8490, 16885, 1012, 5324, 2024, 9186, 1012, 2047, 9620, 1998, 3506, 2024, 2108, 2328, 1012, 1998, 2045, 2024, 5606, 1997, 2047, 5841, 1010, 2437, 12163, 2471, 3904, 9048, 16173, 2102, 1012, 2054, 2842, 2052, 2017, 2066, 1029, 2695, 3077, 2085, 2038, 2570, 2367, 24904, 1010, 2021, 2070, 6319, 4033, 1005, 1056, 10979, 1996, 24159, 1012, 2027, 2031, 2053, 5427, 2006, 2037, 3765, 102], 'tags': [4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 0, 1, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, -1], 'context_mask': [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 'turn_mask': 0}, {'txt_ids': [101, 2424, 2035, 20248, 2576, 11422, 1999, 1996, 6123, 1012, 102, 5925, 2739, 2466, 102, 2066, 2116, 27399, 2163, 1010, 5947, 2038, 2018, 4390, 4363, 2402, 2111, 2091, 2006, 1996, 3888, 2030, 5973, 2306, 2110, 3210, 1012, 2007, 2313, 14071, 2075, 1010, 1996, 2110, 2003, 2559, 3458, 2049, 6645, 2005, 24159, 1012, 2004, 5925, 1005, 1055, 3958, 16596, 4904, 3406, 4311, 1010, 2028, 2210, 2237, 2089, 3073, 1037, 2502, 10800, 1012, 2006, 20772, 2305, 2695, 3077, 5683, 2066, 9627, 1010, 3915, 1010, 2021, 1037, 2298, 2105, 2023, 2237, 1997, 1016, 1010, 2199, 3065, 2009, 1005, 1055, 2468, 1037, 12973, 8547, 2479, 1012, 2023, 2001, 2019, 2035, 1011, 2317, 1010, 2035, 1011, 3017, 2451, 2008, 2035, 1996, 5573, 2001, 2579, 2058, 1011, 1011, 2025, 2579, 2058, 1010, 2008, 1005, 1055, 1037, 2200, 2919, 3601, 1997, 2616, 1010, 2021, 10836, 2011, 1010, 3383, 2367, 2967, 1012, 2009, 2211, 2043, 1037, 2038, 28173, 2278, 3644, 2155, 4149, 2028, 1997, 1996, 2237, 1005, 1055, 2048, 6240, 1011, 14743, 4264, 2410, 2086, 3283, 1012, 2034, 2027, 2716, 1999, 2060, 2038, 28173, 2278, 5181, 1010, 2059, 4916, 2015, 1010, 21524, 1010, 5969, 2015, 1012, 1996, 3269, 1998, 2178, 2279, 3573, 2904, 1996, 2227, 1997, 2695, 3077, 1012, 1045, 2228, 2695, 3077, 2453, 2022, 9105, 2039, 2007, 1996, 2717, 1997, 2637, 1012, 2065, 2017, 2298, 2035, 2058, 2637, 1010, 2065, 2017, 2106, 1037, 2817, 1997, 2151, 2307, 2103, 1010, 2017, 2052, 2156, 1996, 2168, 2518, 1012, 1996, 4264, 3271, 12996, 3171, 2458, 1999, 1037, 2237, 2008, 2018, 2146, 2042, 2358, 8490, 16885, 1012, 5324, 2024, 9186, 1012, 2047, 9620, 1998, 3506, 2024, 2108, 2328, 1012, 1998, 2045, 2024, 5606, 1997, 2047, 5841, 1010, 2437, 12163, 2471, 3904, 9048, 16173, 2102, 1012, 2054, 2842, 2052, 2017, 2066, 1029, 2695, 3077, 2085, 2038, 2570, 2367, 24904, 1010, 2021, 2070, 6319, 4033, 1005, 1056, 10979, 1996, 24159, 1012, 2027, 2031, 2053, 5427, 2006, 2037, 3765, 102], 'tags': [4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, 4, 4, 3, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 2, 4, 4, 3, 4, 3, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 0, 2, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 2, 4, 4, 4, 0, 2, 4, 4, 4, 4, 4, 4, 3, 4, 3, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, -1], 'context_mask': [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 'turn_mask': 0}, {'txt_ids': [101, 2424, 2035, 3295, 11422, 1999, 1996, 6123, 1012, 102, 5925, 2739, 2466, 102, 2066, 2116, 27399, 2163, 1010, 5947, 2038, 2018, 4390, 4363, 2402, 2111, 2091, 2006, 1996, 3888, 2030, 5973, 2306, 2110, 3210, 1012, 2007, 2313, 14071, 2075, 1010, 1996, 2110, 2003, 2559, 3458, 2049, 6645, 2005, 24159, 1012, 2004, 5925, 1005, 1055, 3958, 16596, 4904, 3406, 4311, 1010, 2028, 2210, 2237, 2089, 3073, 1037, 2502, 10800, 1012, 2006, 20772, 2305, 2695, 3077, 5683, 2066, 9627, 1010, 3915, 1010, 2021, 1037, 2298, 2105, 2023, 2237, 1997, 1016, 1010, 2199, 3065, 2009, 1005, 1055, 2468, 1037, 12973, 8547, 2479, 1012, 2023, 2001, 2019, 2035, 1011, 2317, 1010, 2035, 1011, 3017, 2451, 2008, 2035, 1996, 5573, 2001, 2579, 2058, 1011, 1011, 2025, 2579, 2058, 1010, 2008, 1005, 1055, 1037, 2200, 2919, 3601, 1997, 2616, 1010, 2021, 10836, 2011, 1010, 3383, 2367, 2967, 1012, 2009, 2211, 2043, 1037, 2038, 28173, 2278, 3644, 2155, 4149, 2028, 1997, 1996, 2237, 1005, 1055, 2048, 6240, 1011, 14743, 4264, 2410, 2086, 3283, 1012, 2034, 2027, 2716, 1999, 2060, 2038, 28173, 2278, 5181, 1010, 2059, 4916, 2015, 1010, 21524, 1010, 5969, 2015, 1012, 1996, 3269, 1998, 2178, 2279, 3573, 2904, 1996, 2227, 1997, 2695, 3077, 1012, 1045, 2228, 2695, 3077, 2453, 2022, 9105, 2039, 2007, 1996, 2717, 1997, 2637, 1012, 2065, 2017, 2298, 2035, 2058, 2637, 1010, 2065, 2017, 2106, 1037, 2817, 1997, 2151, 2307, 2103, 1010, 2017, 2052, 2156, 1996, 2168, 2518, 1012, 1996, 4264, 3271, 12996, 3171, 2458, 1999, 1037, 2237, 2008, 2018, 2146, 2042, 2358, 8490, 16885, 1012, 5324, 2024, 9186, 1012, 2047, 9620, 1998, 3506, 2024, 2108, 2328, 1012, 1998, 2045, 2024, 5606, 1997, 2047, 5841, 1010, 2437, 12163, 2471, 3904, 9048, 16173, 2102, 1012, 2054, 2842, 2052, 2017, 2066, 1029, 2695, 3077, 2085, 2038, 2570, 2367, 24904, 1010, 2021, 2070, 6319, 4033, 1005, 1056, 10979, 1996, 24159, 1012, 2027, 2031, 2053, 5427, 2006, 2037, 3765, 102], 'tags': [4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, -1], 'context_mask': [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 'turn_mask': 0}]\n"
     ]
    }
   ],
   "source": [
    "file = \"./pickle_data\"\n",
    "\n",
    "with open(\"pick_data.json\", 'r', encoding='utf-8') as f:\n",
    "    data = json.load(f)\n",
    "    \n",
    "    dump_data = pickle.dump(data, open(file, \"wb\"))# 序列化成二进制文件\n",
    "\n",
    "with open(\"pickle_data\", \"rb\") as f:\n",
    "    data = pickle.load(f)\n",
    "    print(data)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 11.endswitch()判断字符串是否以指定后缀结尾\n",
    "用于判断字符串是否以指定后缀结尾，如果以指定后缀结尾返回True，否则返回False"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 168,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "True\n"
     ]
    }
   ],
   "source": [
    "str = \"this is string example....wow!!!\";\n",
    "\n",
    "print(str.endswith(\"!!!\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <span id=12>12.os.listdir()返回指定的文件夹包含的文件或文件夹的名字的列表</span>\n",
    "返回指定的文件夹包含的文件或文件夹的名字的列表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 170,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      ".ipynb_checkpoints\n",
      "pickle_data\n",
      "pick_data.json\n",
      "question-2021年11月25日.ipynb\n",
      "question-2021年11月26日上午.ipynb\n",
      "question-2021年11月26日下午19点.ipynb\n",
      "test.json\n",
      "test.log\n"
     ]
    }
   ],
   "source": [
    "for f in os.listdir(\"./\"):\n",
    "    print(f)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 13.os.path.join()路径拼接\n",
    "路径拼接\n",
    "* 默认都是字符串，可自动加上路径分隔符"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'os' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-32-84517cd98daf>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      4\u001b[0m \u001b[0mfile\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;34m\"filename\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      5\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 6\u001b[1;33m \u001b[0mpath\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mos\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpath_1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpath_2\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpath_3\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfile\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      7\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mNameError\u001b[0m: name 'os' is not defined"
     ]
    }
   ],
   "source": [
    "path_1 = \"path1\"\n",
    "path_2 = \"path2\"\n",
    "path_3 = \"path3\"\n",
    "file = \"filename\"\n",
    "\n",
    "path = os.path.join(path_1, path_2, path_3, file)\n",
    "print(path)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 当拼接的路径中，出现了一个绝对路径，那么它前面的都将会舍弃"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'os' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-33-cfb02dced610>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      4\u001b[0m \u001b[0mfile\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;34m\"filename\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      5\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 6\u001b[1;33m \u001b[0mpath\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mos\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpath_1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpath_2\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpath_3\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfile\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      7\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mNameError\u001b[0m: name 'os' is not defined"
     ]
    }
   ],
   "source": [
    "path_1 = \"path1\"\n",
    "path_2 = \"D:\\path2\"\n",
    "path_3 = \"path3\"\n",
    "file = \"filename\"\n",
    "\n",
    "path = os.path.join(path_1, path_2, path_3, file)\n",
    "print(path)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 14.os.path.split()分割文件名和路径，返回元组\n",
    "* 最后一个 '/' 作为分隔符，分隔后，将索引为0的视为目录（路径），将索引为1的视为文件名\n",
    "* **将当前文件夹下的文件名和路径分离，返回一个元组**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 182,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('D:\\\\path2\\\\path3', 'filename')\n"
     ]
    }
   ],
   "source": [
    "print(os.path.split(path))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 15.str.strip(rm)删除开头和结尾的空字符\n",
    "* str:&nbsp;&nbsp;要操作的字符串\n",
    "* rm:&nbsp;&nbsp;需要删除的字符串序列\n",
    "    * 只能删除开头和结尾出的模式串"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 185,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1  2  3\n"
     ]
    }
   ],
   "source": [
    "str = \"      1  2  3   \"\n",
    "print(str.strip())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 188,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\t\tab\tc\t\n",
      "ab\tc\n"
     ]
    }
   ],
   "source": [
    "str = \"\\t\\tab\\tc\\t\"\n",
    "print(str)\n",
    "print(str.strip())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 16.dir(obj)返回数据结构的有效属性\n",
    "返回obj所有有效属性"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 189,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']\n"
     ]
    }
   ],
   "source": [
    "list = [1, 2]\n",
    "print(dir(list))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 193,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']\n"
     ]
    }
   ],
   "source": [
    "dict = {\"1\": 2}\n",
    "print(dir(dict))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <span id=17>17.列表排序sorted(list, key=lambad x: x[0])</span>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 196,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[('GPE', 88, 91, 'jabaliya'), ('LOC', 91, 92, 'area'), ('VEH', 79, 80, 'heli')]\n",
      "[('VEH', 79, 80, 'heli'), ('GPE', 88, 91, 'jabaliya'), ('LOC', 91, 92, 'area')]\n",
      "[('VEH', 79, 80, 'heli'), ('GPE', 88, 91, 'jabaliya'), ('LOC', 91, 92, 'area')]\n",
      "[('LOC', 91, 92, 'area'), ('VEH', 79, 80, 'heli'), ('GPE', 88, 91, 'jabaliya')]\n"
     ]
    }
   ],
   "source": [
    "list = [('LOC', 91, 92, 'area'), ('GPE', 88, 91, 'jabaliya'),('VEH', 79, 80, 'heli')]\n",
    "print(sorted(list, key=lambda x: x[0]))\n",
    "print(sorted(list, key=lambda x: x[1]))\n",
    "print(sorted(list, key=lambda x: x[2]))\n",
    "print(sorted(list, key=lambda x: x[3]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 17-1.字典的排序sorted(d.items(), key=lambda x: x[1])中 d.items()为待排序的对象"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([('a', 24), ('g', 52), ('i', 12), ('k', 33)],\n",
       " [('i', 12), ('a', 24), ('k', 33), ('g', 52)])"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d = {'a': 24, 'g': 52, 'i': 12, 'k': 33}\n",
    "\n",
    "x = sorted(d.items(), key=lambda x : x[0])\n",
    "y = sorted(d.items(), key=lambda x : x[1])\n",
    "x, y"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 对列表中的age排序"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'name1': 'a', 'age': 20},\n",
       " {'name3': 'c', 'age': 25},\n",
       " {'name2': 'b', 'age': 30}]"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "alist = [{'name1': 'a', 'age': 20}, {'name2': 'b', 'age': 30}, {'name3': 'c', 'age': 25}]\n",
    "\n",
    "sorted(alist, key=lambda x: x[\"age\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 17-2.sort和sorted的区别\n",
    "1. sort是在列表上排序，属于列表的成员方法\n",
    "    * 直接对列表进行排序，改变了列表的原始数据\n",
    "    * $ls.sort()$\n",
    "2. sorted是在所有可迭代对象上进行排序操作\n",
    "    * 返回一个全新的可迭代对象，没有改变原表的数据\n",
    "    * $sorted(ls)$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([5, 7, 6, 3, 4, 1, 2], [1, 2, 3, 4, 5, 6, 7])"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = [5,7,6,3,4,1,2]\n",
    "b = sorted(a)\n",
    "a, b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[1, 2, 3, 4, 5, 6, 7]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = [5,7,6,3,4,1,2]\n",
    "a.sort()\n",
    "a"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 18.反转字典的key和value"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 取出字典的key"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['FAC', 'GPE']\n",
      "['FAC', 'GPE']\n"
     ]
    }
   ],
   "source": [
    "dict = {'FAC': 'find all facility entities in the context.', 'GPE': 'find all geo political entities in the context.'}\n",
    "\n",
    "print([value for value in dict])\n",
    "\n",
    "print([k for k, _ in dict.items()])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 将字典对应的value作为key,并将新生成的字典的value置为空列表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'find all facility entities in the context.': [], 'find all geo political entities in the context.': []}\n"
     ]
    }
   ],
   "source": [
    "dict = {'FAC': 'find all facility entities in the context.', 'GPE': 'find all geo political entities in the context.'}\n",
    "\n",
    "dict_swap = {dict[value]: [] for value in dict}\n",
    "print(dict_swap)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 将字典的key和value互换"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'find all facility entities in the context.': 'FAC', 'find all geo political entities in the context.': 'GPE'}\n"
     ]
    }
   ],
   "source": [
    "dict = {'FAC': 'find all facility entities in the context.', 'GPE': 'find all geo political entities in the context.'}\n",
    "\n",
    "dict_swap = {value: key for key, value in dict.items()}\n",
    "print(dict_swap)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <span id=19>19.将关系三元组(rel, ent1, ent2)转换为{(ent1, rel, ent2.type):[]}尾实体作为value，方便问题的提出</span>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{(('GPE', 14, 15, 'haifa'), 'PART-WHOLE', 'GPE'): []}"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "relas = [('PART-WHOLE', ('GPE', 14, 15, 'haifa'), ('GPE', 16, 17, 'israel'))]                      \n",
    "dict = {(rel[1], rel[0], rel[2][0]): [] for rel in relas}\n",
    "dict"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{(('GPE', 14, 15, 'haifa'), 'PART-WHOLE', 'GPE'): [('GPE', 16, 17, 'israel'),\n",
       "  ('GPE', 16, 17, 'israel')]}"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "for rel in relas:\n",
    "    dict[(rel[1], rel[0], rel[2][0])].append(rel[2])\n",
    "dict"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[(1, 'keu'), (2, 'key'), (3, 'vlue')]\n",
      "[]\n",
      "[(1, 'keu'), (2, 'key'), (3, 'vlue')]\n"
     ]
    }
   ],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5.re正则表达式\n",
    "* search() 用于在整个字符串中搜索第一个匹配的值,\n",
    "    * 如果匹配成功,则返回一个Match对象,\n",
    "    * 否则返回None."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<re.Match object; span=(23, 29), match='python'>\n",
      "python\n",
      "====================万能的分隔符====================\n",
      "None\n"
     ]
    }
   ],
   "source": [
    "res = re.search(\"python\", \"Life is short. I learn python!\")\n",
    "print(res)\n",
    "print(res.group())\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "\n",
    "res = re.search(\"java\", \"Life is short. I learn python!\")\n",
    "print(res)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 是否区分大小写匹配， re.I"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "None\n",
      "<re.Match object; span=(23, 29), match='python'>\n",
      "python\n"
     ]
    }
   ],
   "source": [
    "res = re.search(\"Python\", \"Life is short. I learn python!\")\n",
    "print(res)# 输出结果:None\n",
    "\n",
    "res = re.search(\"Python\", \"Life is short. I learn python!\", re.I)\n",
    "print(res)# 输出结果:<_sre.SRE_Match object; span=(23, 29), match='python'>\n",
    "print(res.group())# 输出结果:python"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 输出匹配位置和原配字符串"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "23\n",
      "29\n",
      "(23, 29)\n"
     ]
    }
   ],
   "source": [
    "res = re.search(\"python\", \"Life is short. I learn python!\")\n",
    "print(res.start())  # 匹配字符串的开始位置\n",
    "# 输出结果:23\n",
    "print(res.end())  # 匹配字符串的结束位置\n",
    "# 输出结果:29\n",
    "print(res.span())  # 匹配字符串的元组(开始位置+结束位置)\n",
    "# 输出结果:(23, 29)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 定义一个正则对象调用"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<re.Match object; span=(4, 5), match='2'>\n",
      "2\n"
     ]
    }
   ],
   "source": [
    "pat = re.compile(\"[0-9]\")  # 匹配单个数字\n",
    "res = pat.search(\"abcd23ef4gh!\")\n",
    "\n",
    "print(res)\n",
    "# 输出结果:<_sre.SRE_Match object; span=(4, 5), match='2'>\n",
    "print(res.group())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4.collections类中的defaultdict()方法可以为字典提供默认值\n",
    "\n",
    "* Python中通过Key访问字典，当Key不存在时，会引发‘KeyError’异常。\n",
    "* 为了避免这种情况的发生，可以使用collections类中的defaultdict()方法来为字典提供默认值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1, 4, 2, 5]\n",
      "====================万能的分隔符====================\n",
      "defaultdict(<class 'list'>, {0: [1], 1: [4], 2: [2], 3: [5]})\n",
      "{0: [1], 1: [4], 2: [2], 3: [5]}\n"
     ]
    }
   ],
   "source": [
    "by_list = defaultdict(list)\n",
    "listA = [1, 4, 2, 5]\n",
    "print(listA)\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "\n",
    "for index in range(len(listA)):\n",
    "    by_list[index].append(listA[index])\n",
    "    \n",
    "print(by_list)\n",
    "print(dict(by_list))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3.numpy.meshgrid用向量生成坐标矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 1  0  4]\n",
      " [-4  2  2]]\n",
      "====================万能的分隔符====================\n",
      "[10. 15. 20.]\n",
      "====================万能的分隔符====================\n",
      "[[ 1  0  4 -4  2  2]\n",
      " [ 1  0  4 -4  2  2]\n",
      " [ 1  0  4 -4  2  2]]\n",
      "[[10. 10. 10. 10. 10. 10.]\n",
      " [15. 15. 15. 15. 15. 15.]\n",
      " [20. 20. 20. 20. 20. 20.]]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x1514480c608>,\n",
       " <matplotlib.lines.Line2D at 0x151448a2808>,\n",
       " <matplotlib.lines.Line2D at 0x151448a2248>,\n",
       " <matplotlib.lines.Line2D at 0x151448a2388>,\n",
       " <matplotlib.lines.Line2D at 0x15143577788>,\n",
       " <matplotlib.lines.Line2D at 0x151435779c8>]"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.random.normal(2, 3, size=(2,3)).astype(\"int16\")\n",
    "# x.shape = (2,3)\n",
    "print(x)\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "\n",
    "y = np.linspace(10,20,3)\n",
    "print(y)\n",
    "print(20*\"=\" + \"万能的分隔符\"+ 20*\"=\")\n",
    "\n",
    "p, q = np.meshgrid(x,y)\n",
    "print(p)\n",
    "print(q)\n",
    "\n",
    "plt.plot(p, q, marker= '.')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
